package com.zhihuishu.micro.course.service;

import com.zhihuishu.micro.course.dto.TreenityDto;
import com.zhihuishu.micro.course.service.impl.BaseTreenityServiceRedisImpl;

import java.util.List;


/**
 * 课程-对象关系 redis key一般模式如下
 * --> xx:courseId->id1,id2,id3 (set)
 *
 * 对象id-对象 redis key一般模式如下
 * --> xx:id->{propA:xx,propB:xx} (hash)
 *
 *
 * @author jiangli
 *
 * 该接口的公共实现类是
 * @see BaseTreenityServiceRedisImpl
 *
 * 完成了redis通用操作——比如从redis里读取对象数据，添加到redis课程-对象关系，等等
 * 子类只需要实现下列方法
 * {@link BaseTreenityServiceRedisImpl#getDTOClass()}
 * {@link #getObjectKey(Integer)}
 * {@link #getIdsKey(long)}
 */
public interface TreenityRedisService<DTO extends TreenityDto> extends TreenityService<DTO>{
    /**
     * 使用一个redis连接来更新redis中的多个dto对象
     */
    void updateObjectListCache(List<DTO> list);

    /**
     * 使用一个redis连接来更新redis中的单个dto对象
     */
    void updateObjectCache(DTO dto);

    /**
     * 将redis中的 课程-对象 关系数据更新为
     * @param listDtoIds
     * 会删除原有关系
     */
    void updateIdListCache(long oneToManyId, List<Integer> listDtoIds);

    /**
     * 为redis中的 课程-对象 关系数据添加一条数据
     * @param newDtoId
     */
    void addIdInListCache(long oneToManyId, Integer newDtoId);

    /**
     * 规定 对象id-对象 的实际key是什么
     * 子类需要实现！
     * 例：
     * 在章中实际key是——cc:chapter:${chapterId}
     */
    String getObjectKey(final Integer dtoId);

    /**
     * 规定 课程-对象关系 的实际key是什么
     * 子类需要实现！
     * 例：
     * 在章中实际key是——cc:course:${oneToManyId}:chapters:all
     */
    String getIdsKey(final long oneToManyId);

    /**
     * 从redis中的 课程-对象 关系数据移除一条数据
     * @param dtoId
     */
    void deleteRelationShip(final long oneToManyId, Integer dtoId);


}
